---@class GT.rec_area:GT.area 区域
---@field rec_area RecArea
GT.rec_area = class(GT.area, false)

---@class rec_area_data
---@field rec_area RecArea

---矩形区域
---@param data any
function GT.rec_area:ctor(data)
    self.rec_area = data.rec_area
    data.area = self.rec_area
    super(self, data)
end


---@param rec_area RecArea
function GT.rec_area.obj(rec_area)
    return new(GT.rec_area, { rec_area = rec_area })
end

--- 通过区域ID返回矩形区域
---@param res_id AreaID 区域ID
---@return GT.rec_area
function GT.rec_area.get_id(res_id)
    return GT.rec_area.obj(game_api.get_rec_area_by_res_id(res_id))
end

--- 创建矩形区域
---@param point FVector3 左下方起始点
---@param width Fixed 宽
---@param height Fixed 高
---@return GT.rec_area
function GT.rec_area.create_new_rec_area(point, width, height)
    return GT.rec_area.obj(game_api.create_new_rec_area(point, width, height))
end

--- 创建矩形区域
---@param center FVector3 中心点
---@param width Fixed 宽
---@param height Fixed 高
---@return GT.rec_area
function GT.rec_area.create_rect_area_by_center(center, width, height)
    return GT.rec_area.obj(game_api.create_rect_area_by_center(center, width, height))
end

--- 创建矩形区域
---@param point_begin Point 起始点
---@param point_end Point 终点
---@return GT.rec_area
function GT.rec_area.create_rec_area_from_two_points(point_begin, point_end)
    return GT.rec_area.obj(game_api.create_rec_area_from_two_points(point_begin, point_end))
end

--- 根据tag获取对应的矩形区域
---@param tag Str tag
---@return GT.rec_area
function GT.rec_area.get_rect_areas_by_tag(tag)
    return GT.rec_area.obj(game_api.get_rect_areas_by_tag(tag))
end

-- 设置矩形区域大小
---@param length Fixed 长
---@param width Fixed 宽
function GT.rec_area:set_rect_area_radius(length, width)
    game_api.set_rect_area_radius(self.rec_area, length, width)
end

--- 获取矩形区域内最小X坐标
---@return Fixed
function get_rect_area_min_x()
    return game_api.get_rect_area_min_x(self.rec_area)
end

--- 获取矩形区域内最小Y坐标
---@return Fixed
function GT.rec_area:get_rect_area_min_y(area)
    return game_api.get_rect_area_min_y(self.rec_area)
end

--- 获取矩形区域内最大X坐标
---@return Fixed
function GT.rec_area:get_rect_area_max_x(area)
    return game_api.get_rect_area_max_x(self.rec_area)
end

--- 获取矩形区域内最大Y坐标
---@return Fixed
function GT.rec_area:get_rect_area_max_y(area)
    return game_api.get_rect_area_max_y(self.rec_area)
end

--- 最近创建的矩形区域
---@return GT.rec_area
function GT.rec_area.get_rec_area_last_created()
    ---@type rec_area_data
    local data = {
        rec_area = game_api.get_rec_area_last_created()
    }
    return new(GT.rec_area, data)
end

--- 获取可用地图范围
---@return GT.rec_area
function GT.rec_area.get_usable_map_range()
    ---@type rec_area_data
    local data = {
        rec_area = game_api.get_usable_map_range()
    }
    return new(GT.rec_area, data)
end

--- 点是否在矩形区域内
---@param point FPoint 点
---@return Bool
function GT.rec_area:judge_point_in_rec_area(point)
    return game_api.judge_point_in_rec_area(point, self.rec_area)
end

--- 矩形区域内单位数量
---@return UInt32
function GT.rec_area:get_unit_num_in_rec_area()
    return game_api.get_unit_num_in_rec_area(self.rec_area)
end

--- 矩形区域内所有未销毁单位单位
---@return UnitGroup
function GT.rec_area:get_unit_group_in_rec_area(area)
    return game_api.get_unit_group_in_rec_area(self.rec_area)
end

--- 矩形区域内所有物品
---@param area RecArea 矩形区域
---@return ItemGroup
function GT.rec_area:get_item_group_in_rec_area()
    return game_api.get_item_group_in_rec_area(self.rec_area)
end

--- 矩形区域是否拥有某tags
---@param tag Str tag
---@return Bool
function GT.rec_area:if_rect_area_has_tag(area, tag)
    return game_api.if_rect_area_has_tag(self.rec_area, tag)
end

--- 设置矩形区域内视野情况
---@param player Role 玩家
---@param is_vision Bool 布尔变量
---@param is_vision_true Bool 布尔变量
---@return GT.rec_area
function GT.rec_area:set_rect_vision_visibility(player, is_vision, is_vision_true)
    game_api.set_rect_vision_visibility(self.rec_area, player, is_vision, is_vision_true)
    return GT.rec_area
end

--- 矩形区域是否存在
---@param rect_area RecArea 矩形区域
---@return Bool
function GT.rec_area.rect_area_is_exist(rect_area)
    return game_api.rect_area_is_exist(rect_area)
end

--- 返回矩形区域内随机点
---@return GT.point
function GT.rec_area:get_random_point_in_rec_area()
    ---@type point_data
    local data = {
        point = game_api.get_random_point_in_rec_area(self.rec_area)
    }
    return new(GT.point, data)
end

--- 返回矩形区域中心点
---@return GT.point
function GT.rec_area:get_rec_center_point()
    ---@type point_data
    local data = {
        point = game_api.get_rec_center_point(self.rec_area)
    }
    return new(GT.point, data)
end
